"""
练习 9.1：餐馆 创建⼀个名为 Restaurant 的类，为其
__init__() ⽅法设置两个属性：restaurant_name 和
cuisine_type。创建⼀个名为 describe_restaurant() 的⽅法
和⼀个名为 open_restaurant() 的⽅法，其中前者打印前述两项信
息，⽽后者打印⼀条消息，指出餐馆正在营业。
根据这个类创建⼀个名为 restaurant 的实例，分别打印其两个属
性，再调⽤前述两个⽅法。

class Restaurant :
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
    def describe_restaurant(self):
        print(self.restaurant_name,self.cuisine_type)
    def open_restaurant(self):
        print(f'The restaurant is opening!')
my_restaurant = Restaurant('麦当劳','快餐')
my_restaurant.describe_restaurant()
my_restaurant.open_restaurant()
"""
from secrets import token_urlsafe

"""
练习 9.2：三家餐馆 根据为练习 9.1 编写的类创建三个实例，并对每
个实例调⽤ describe_restaurant() ⽅法。
class Restaurant :
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
    def describe_restaurant(self):
        print(self.restaurant_name,self.cuisine_type)
    def open_restaurant(self):
        print(f'The restaurant is opening!')
my_restaurant1 = Restaurant('麦当劳','快餐')
my_restaurant1.open_restaurant()
my_restaurant2 = Restaurant('肯德基','快餐')
my_restaurant3 = Restaurant('达美乐','快餐')
my_restaurant1.describe_restaurant()
my_restaurant2.describe_restaurant()
my_restaurant3.describe_restaurant()
"""

"""
练习 9.3：⽤户 创建⼀个名为 User 的类，其中包含属性
first_name 和 last_name，还有⽤户简介中通常会有的其他⼏个
属性。在类 User 中定义⼀个名为 describe_user() 的⽅法，⽤于
打印⽤户信息摘要。再定义⼀个名为 greet_user() 的⽅法，⽤于向
⽤户发出个性化的问候。
创建多个表⽰不同⽤户的实例，并对每个实例调⽤上述两个⽅法。

class User :
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name
    def describe_user(self):
        print(f'fist_name:{self.first_name} , last_name:{self.last_name}')
    def greet_user(self):
        print(f'Hello! Good to see you , {self.first_name}{self.last_name}!')
User1 = User('王','小明')
User1.describe_user()
User1.greet_user()
"""

"""
练习 9.4：就餐⼈数 在为练习 9.1 编写的程序中，添加⼀个名为
number_served 的属性，并将其默认值设置为 0。根据这个类创建⼀
个名为 restaurant 的实例。打印有多少⼈在这家餐馆就餐过，然后
修改这个值并再次打印。
添加⼀个名为 set_number_served() 的⽅法，⽤来设置就餐⼈
数。调⽤这个⽅法并向它传递新的就餐⼈数，然后再次打印这个值。
添加⼀个名为 increment_number_served() 的⽅法，⽤来让就餐
⼈数递增。调⽤这个⽅法并向它传递⼀个这样的值：你认为这家餐馆
每天可能接待的就餐⼈数。

class Restaurant :
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
        self.number_served = 0
    def describe_restaurant(self):
        print(self.restaurant_name,self.cuisine_type)
    def open_restaurant(self):
        print(f'The restaurant is opening!')
    def read_number_served(self):
        print(f'Today we have served {self.number_served}')
    def set_number_served(self,people_number):
        self.number_served = people_number
        print(f'The restaurant have served {self.number_served} people now.')
    def increment_number_served(self,people_number):
        self.number_served += people_number
        print(f'The restaurant can serve {self.number_served} people everyday.')
restaurant= Restaurant('麦当劳','快餐')
restaurant.describe_restaurant()
restaurant.open_restaurant()
restaurant.read_number_served()
restaurant.set_number_served(33)
restaurant.increment_number_served(22)

"""


"""
练习 9.5：尝试登录次数 在为练习 9.3 编写的 User 类中，添加⼀个
名为 login_attempts 的属性。编写⼀个名为
increment_login_attempts() 的⽅法，⽤来将属性
login_attempts 的值加 1。再编写⼀个名为
reset_login_attempts() 的⽅法，⽤来将属性
login_attempts 的值重置为 0。
根据 User 类创建⼀个实例，再调⽤
increment_login_attempts() ⽅法多次。打印属性
login_attempts 的值，确认它正确地递增了。然后，调⽤⽅法
reset_login_attempts()，并再次打印属性 login_attempts
的值，确认它被重置为 0。

class User :
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name
        self.login_attempts = 0
    def describe_user(self):
        print(f'fist_name:{self.first_name} , last_name:{self.last_name}')
    def greet_user(self):
        print(f'Hello! Good to see you , {self.first_name}{self.last_name}!')
    def increment_login_attempts(self):
        self.login_attempts += 1
    def reset_login_attempts(self):
        self.login_attempts = 0
User1 = User('王','小明')
User1.increment_login_attempts()
User1.increment_login_attempts()
print(f'{User1.login_attempts} users have login.')
User1.reset_login_attempts()
print(f'Login_attempts have reset to {User1.login_attempts}')
"""

"""
练习 9.6：冰激凌⼩店 冰激凌⼩店是⼀种特殊的餐馆。编写⼀个名为
IceCreamStand 的类，让它继承你为练习 9.1 或练习 9.4 编写的
Restaurant 类。这两个版本的 Restaurant 类都可以，挑选你更喜
欢的那个即可。添加⼀个名为 flavors 的属性，⽤于存储⼀个由各种
⼝味的冰激凌组成的列表。编写⼀个显⽰这些冰激凌⼝味的⽅法。创
建⼀个 IceCreamStand 实例，并调⽤这个⽅法。

class Restaurant :
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
    def describe_restaurant(self):
        print(self.restaurant_name,self.cuisine_type)
    def open_restaurant(self):
        print(f'The restaurant is opening!')

class IceCreamStand(Restaurant) :
    def __init__(self,restaurant_name,cuisine_type):
        super().__init__(restaurant_name,cuisine_type)
        self.flavors = []
    def describe_icecream_flavors(self):
        print(f'The {self.restaurant_name}\'s IceCreams have many flavors such as {self.flavors}')

icecream = IceCreamStand('麦当劳','快餐')
icecream.flavors = 'chocolate','banana'
icecream.describe_icecream_flavors()
"""


"""
练习 9.7：管理员 管理员是⼀种特殊的⽤户。编写⼀个名为 Admin
的类，让它继承你为练习 9.3 或练习 9.5 完成编写的 User 类。添加⼀
个名为 privileges 的属性，⽤来存储⼀个由字符串（如 "can add
post"、"can delete post"、"can ban user" 等）组成的列
表。编写⼀个名为 show_privileges() 的⽅法，显⽰管理员的权
限。创建⼀个 Admin 实例，并调⽤这个⽅法。
class User:
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name

    def describe_user(self):
        print(f'fist_name:{self.first_name} , last_name:{self.last_name}')

    def greet_user(self):
        print(f'Hello! Good to see you , {self.first_name}{self.last_name}!')

class Admin(User) :
    def __init__(self,first_name,last_name):
        super().__init__(first_name,last_name)
        self.privileges = []
    def show_privileges(self):
        print(f'The admin\'s are:')
        print(self.privileges)
Admin = Admin('周','大强')
Admin.privileges = 'can delete post','can add post','can ban user'
Admin.show_privileges()
"""

"""
练习 9.8：权限 编写⼀个名为 Privileges 的类，它只有⼀个属性
privileges，其中存储了练习 9.7 所述的字符串列表。将⽅法
show_privileges() 移到这个类中。在 Admin 类中，将⼀个
Privileges 实例⽤作其属性。创建⼀个 Admin 实例，并使⽤⽅法
show_privileges() 来显⽰权限。

class User:
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name

    def describe_user(self):
        print(f'fist_name:{self.first_name} , last_name:{self.last_name}')

    def greet_user(self):
        print(f'Hello! Good to see you , {self.first_name}{self.last_name}!')

class Admin(User) :
    def __init__(self,first_name,last_name):
        super().__init__(first_name,last_name)
        self.privileges = Privileges()
    def show_privileges(self):
        self.privileges.show_privileges()

class Privileges(User):
    def __init__(self):
        self.privileges = ['can delete post','can add post','can ban user']
    def show_privileges(self):
        print(f'The admin\'s are:')
        print(self.privileges)

Admin = Admin('周','大强')
Admin.privileges.show_privileges()
"""


"""
练习 9.9：电池升级 在本节最后⼀个 electric_car.py 版本中，给
Battery 类添加⼀个名为 upgrade_battery() 的⽅法。这个⽅法
检查电池容量，如果电池容量不是 65，就设置为 65。创建⼀辆电池容
量为默认值的电动汽⻋，调⽤⽅法 get_range()，然后对电池进⾏升
级，并再次调⽤ get_range()。你将看到这辆汽⻋的续航⾥程增加
了。

"""

"""
练习 9.13：骰⼦ 创建⼀个 Die 类，它包含⼀个名为 sides 的属性，
该属性的默认值为 6。编写⼀个名为 roll_die() 的⽅法，它打印位
于 1 和骰⼦⾯数之间的随机数。创建⼀个 6 ⾯的骰⼦并掷 10 次。
创建⼀个 10 ⾯的骰⼦和⼀个 20 ⾯的骰⼦，再分别掷 10 次。

from random import  randint
class Die:
    def __init__(self):
        self.sides = 6
    def roll_die(self):
        i = 1
        while i < 11:
           score = randint(1,self.sides+1)
           print(f'对于一个{self.sides}面的色子，第{i}次掷得为：{score}')
           i = i+1
die1 = Die()
die1.roll_die()
print('\n')
die2 = Die()
die2.sides = 10
die2.roll_die()
print('\n')
die3 = Die()
die3.sides = 20
die3.roll_die()
"""


"""
练习 9.14：彩票 创建⼀个列表或元素，其中包含 10 个数和 5 个字
⺟。从这个列表或元组中随机选择 4 个数或字⺟，并打印⼀条消息，
指出只要彩票上是这 4 个数或字⺟，就中⼤奖了。

from random import choices
Lottery_numbers = [1,2,3,4,5,6,7,8,9,10,'F','W','Q','Y','J']
your_Lottery = choices(Lottery_numbers,k = 4)
print(f'Your numbers are ：{your_Lottery} \nWinning numbers : [\'F\',\'Y\',\'J\',\'6\']')
"""


"""
练习 9.15：彩票分析 可以使⽤⼀个循环来理解中前述彩票⼤奖有多
难。为此，创建⼀个名为 my_ticket 的列表或元组，再编写⼀个循
环，不断地随机选择数或字⺟，直到中⼤奖为⽌。请打印⼀条消息，
报告执⾏多少次循环才中了⼤奖。

from random import choices
Lottery_numbers = [1,2,3,4,5,6,7,8,9,10,'F','W','Q','Y','J']
my_ticket = ['F','J','Y',6]
time = 1
your_Lottery = []
while your_Lottery != my_ticket:
    your_Lottery = choices(Lottery_numbers, k=4)
    print(f'你的第{time}次乐透数字为{your_Lottery}')
    time = time + 1
print(f'大概在第{time}次中奖。')
"""
